package com.qiumo.gmtool.mail;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.qiumo.gmtool.common.RetResult;
import com.qiumo.gmtool.config.GenshinConfig;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 一些静态方法
 */
@Component
@Slf4j
public class MailUtil {

    @Resource
    GenshinConfig genshinConfig;

    /**
     * 服务器地址
     */
    @Value("${genshin.muipserver}")
    private String muipServer;

    @Value("${genshin.sign}")
    private String sign;

    @Value("${genshin.mode}")
    private boolean mode;

    /**
     * 处理接口返回信息
     */
    private RetResult msgFunc(JSONObject jsonObject) {
        if (ObjectUtil.isEmpty(jsonObject)) {
            return RetResult.err("发生未知错误，请联系管理员！");
        }

        String recode = jsonObject.getString("retcode");
        if (recode.equals("0")) {
            return RetResult.succ("ok", jsonObject.getJSONObject("data"));
        }
        Map<String, String> errorMap = new HashMap<>();
        errorMap.put("1", "发生未知错误，请联系管理员！");
        errorMap.put("1002", "发生未知错误，请联系管理员！");
        errorMap.put("4", "又不在线，再发我顺着网线打死你！╭(╯^╰)╮");
        errorMap.put("617", "物品数量超限！");
        errorMap.put("627", "物品数量超限！");
        errorMap.put("1003", "服务器验证签名错误！");
        errorMap.put("1010", "服务器区服错误！");
        errorMap.put("1311", "禁止发送「创世结晶」");
        errorMap.put("1312", "游戏货币超限");
        errorMap.put("2006", "禁止重复发送邮件");
        errorMap.put("2028", "邮件日期设置错误");
        errorMap.put("8002", "传说钥匙超过限制！");

        String errorMsg = errorMap.getOrDefault(recode, "发生未知错误，请联系管理员！");
        return RetResult.err(errorMsg);
    }

    /**
     * 处理参数
     */
    private Map<String, Object> handleMap(Map<String, Object> map) {
        if (mode) {
            String collect = map.entrySet().stream()
                .sorted(Map.Entry.comparingByKey())
                .map(entry -> entry.getKey() + "=" + entry.getValue())
                .collect(Collectors.joining("&"));
            String decrypt = DigestUtil.sha256Hex(collect + sign);
            map.put("sign", decrypt);
        }
        return map;
    }

    /**
     * 通用发送请求方法
     */
    private RetResult sendRequest(Map<String, Object> map) {
        try {
            map = handleMap(map);
            String res = HttpUtil.get(muipServer, map);
            log.info("参数列表 -> {}", JSONObject.toJSONString(map));
            log.info("服务器返回结果 -> {}", res);
            JSONObject jsonObject = JSONObject.parseObject(res);
            return msgFunc(jsonObject);
        } catch (Exception e) {
            log.error("连接失败", e);
            return RetResult.err("连接失败。");
        }
    }

    /**
     * 通用发送邮件方法
     */
    public RetResult sendMail(MailParams params) {
        //固定参数
        Map<String, Object> map = genshinConfig.getParamsMap();
        //uid
        map.put("uid", params.getUid());
        //标题
        map.put("title", params.getTitle());
        //内容
        map.put("content", params.getContent());
        //发送者
        map.put("sender", ObjectUtil.isEmpty(params.getSender()) ? "蓝忘机" : params.getSender());
        //附件
        if (ObjectUtil.isNotEmpty(params.getItem_list())) {
            map.put("item_list", params.getItem_list());
        }
        //过期时间
        map.put("expire_time", String.valueOf(getTime()));
        //ticket
        map.put("ticket", String.valueOf(System.currentTimeMillis()));
        //发送get请求
        return sendRequest(map);
    }

    /**
     * 获取一个月后的时间戳
     */
    public long getTime() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        return cal.getTimeInMillis() / 1000;
    }

    /**
     * 发送物品
     */
    public RetResult sendItem(String item, Integer num) {
        //固定参数
        Map<String, Object> map = new HashMap<>();
        map.put("cmd", "1116");
        map.put("uid", StpUtil.getLoginId());
        if (item.equals("203")) {
            map.put("msg", "mcoin " + num);
        } else {
            map.put("msg", "item add " + item + " " + num);
        }
        //发送get请求
        return sendRequest(map);
    }

    /**
     * 发送快捷指令
     */
    public RetResult fastSend(String zl) {
        //固定参数
        Map<String, Object> map = new HashMap<>();
        map.put("cmd", "1116");
        map.put("uid", StpUtil.getLoginId());
        map.put("msg", zl);
        //发送get请求
        return sendRequest(map);
    }

    /**
     * 获取在线状态
     */
    public RetResult getOnline() {
        //固定参数
        Map<String, Object> map = new HashMap<>();
        map.put("cmd", "1129");
        //发送get请求
        return sendRequest(map);
    }
}
